package com.tencent.wxcloudrun.service;

import java.util.List;

import com.baomidou.mybatisplus.extension.service.IService;
import com.tencent.wxcloudrun.domain.TActiJoin;
import com.tencent.wxcloudrun.dto.ActiJoinProdReqDTO;
import com.tencent.wxcloudrun.vo.request.acti.ActiJoinBlackReqVo;
import com.tencent.wxcloudrun.vo.request.acti.ActiJoinReqVo;
import com.tencent.wxcloudrun.vo.request.acti.ActiJoinSelectedReqVo;
import com.tencent.wxcloudrun.vo.response.acti.ActiJoinBlackResVo;
import com.tencent.wxcloudrun.vo.response.acti.ActiJoinResVo;
import com.tencent.wxcloudrun.vo.response.acti.ActiJoinSelectedResVo;

/**
 * @author ziyin.zhao
 * @description 针对表【t_acti_join(活动参选表)】的数据库操作Service
 * @createDate 2025-04-22 17:11:16
 */
public interface TActiJoinService extends IService<TActiJoin> {

    /**
     * 活动是否重复参选校验
     *
     * @param userId 用户ID
     * @param actiId 活动ID
     * @param actiJoinType 活动参选类型
     * @param selectedFlag 活动入围标识
     */
    void joinCheck(Long userId, Long actiId, Integer actiJoinType, Integer selectedFlag);

    /**
     * 活动商品库存校验
     *
     * @param actiId 活动ID
     * @param prodDTOList 参选商品列表
     */
    void joinProdCheck(Long actiId, List<ActiJoinProdReqDTO> prodDTOList);

    /**
     * 活动是否重复参选校验
     *
     * @param userId 用户ID
     * @param actiId 活动ID
     * @param actiJoinType 活动参选类型
     */
    void joinSelectedCheck(Long userId, Long actiId, Integer actiJoinType);

    /**
     * 活动入围缓存处理
     *
     * @param reqVo 请求入参
     */
    ActiJoinSelectedResVo joinSelectedToRedis(ActiJoinSelectedReqVo reqVo);

    /**
     * 活动入围落库处理
     *
     * @param reqVo 请求入参
     */
    void joinSelected(ActiJoinSelectedReqVo reqVo);

    /**
     * 活动参选缓存处理
     *
     * @param reqVo 请求入参
     */
    ActiJoinResVo joinToRedis(ActiJoinReqVo reqVo);

    /**
     * 活动参选落库处理
     *
     * @param reqVo 请求入参
     */
    void joinToDb(ActiJoinReqVo reqVo);

    /**
     * 活动黑箱缓存处理
     *
     * @param reqVo 请求入参
     * @return 是否中选
     */
    ActiJoinBlackResVo joinBlackToRedis(ActiJoinBlackReqVo reqVo);

    /**
     * 活动黑箱
     *
     * @param reqVo 请求入参
     */
    void joinBlack(ActiJoinBlackReqVo reqVo);

    /**
     * 删除参选记录
     * 
     * @param actiId 活动序号
     * @param userId 用户序号
     * @param kind 活动类型
     */
    void deleteJoin(Long actiId, Long userId, Integer kind);

    /**
     * 活动摇号入围
     *
     * @param actiId 活动序号
     * @param numberList 入围号码
     * @return 中选用户列表
     */
    List<TActiJoin> actiSelectedEnd(Long actiId, List<Integer> numberList);

    /**
     * 活动摇号中选
     *
     * @param actiId 活动序号
     * @param userIdList 中选用户列表
     * @return 中选用户列表
     */
    void actiEnd(Long actiId, List<Long> userIdList);

}
